using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GenericsObjectPoolManager<T> : Singleton<GenericsObjectPoolManager<T>> where T : UnityEngine.Object
{
    // 存放所有的对象池，根据名字进行区分
    private Dictionary<string, Stack<T>> genericsObjectPoolDic = new Dictionary<string, Stack<T>>();



    /// <summary>
    /// 创建对象
    /// 没有对象池创建对象池
    /// </summary>
    /// <param name="name">需要创建的物体的路径</param>
    /// <returns></returns>
    public T CreateObject(string name)
    {

        T obj;
        // 判断有没有对象池
        if(genericsObjectPoolDic.ContainsKey(name) && genericsObjectPoolDic[name].Count > 0)
        {
            // 如果有对象池，直接返回，并且激活
            obj = genericsObjectPoolDic[name].Pop();
        }
        else
        {
            // 如果没有对象池，直接创建
            obj = GameObject.Instantiate(Resources.Load<T>(name));
            obj.name = name;
        }

        return obj;
    }

    /// <summary>
    /// 创建对象  音频对象池
    /// 没有对象池创建对象池
    /// 创建对象池函数重载
    /// </summary>
    /// <param name="name">对象池索引名字</param>
    /// <returns></returns>
    public T CreateObject(string name, GameObject obj)
    {
        T t;

        if (genericsObjectPoolDic.ContainsKey(name) && genericsObjectPoolDic[name].Count > 0)
        {
            t = genericsObjectPoolDic[name].Pop();
        }
        else
        {
            GameObject gameObject = new GameObject("音效");
            gameObject.transform.SetParent(obj.transform);
            t = gameObject.AddComponent(typeof(T)) as T;
        }

        return t;
    }

    /// <summary>
    /// 添加到对象池中
    /// </summary>
    /// <param name="gameObject">需要添加的物体</param>
    public void AddObjectPool(T t)
    {
        // 判断有没有对象池
        if(!genericsObjectPoolDic.ContainsKey(t.name))
            // 没有对象池，创建对象池，把数据存入到对象池中
            genericsObjectPoolDic.Add(t.name, new Stack<T>());
        genericsObjectPoolDic[t.name].Push(t);
    }

    /// <summary>
    /// 添加到对象池中
    /// 重载
    /// </summary>
    /// <param name="gameObject">索引名字</param>
    public void AddObjectPool(string name, T t)
    {
        // 判断有没有对象池
        if(!genericsObjectPoolDic.ContainsKey(name))
            // 没有对象池，创建对象池，把数据存入到对象池中
            genericsObjectPoolDic.Add(name, new Stack<T>());
        genericsObjectPoolDic[name].Push(t);
    }


    /// <summary>
    /// 清除对象池
    /// 在切换场景时调用
    /// </summary>
    public void ClearDic()
    {
        genericsObjectPoolDic.Clear();
    }
}